<?php
/** Error reporting */
error_reporting(E_ALL);

date_default_timezone_set('Europe/Kiev');

/** PHPExcel */
require_once '../../lib/PHPExcel.php';
require_once 'ipdepo.class.php';

// Подключение и выбор БД
$uid = 1;
$uname = 'maxzzz';
$upass = 'maxaaa';
$dbname = 'mail_test';
$hname = 'localhost';

$db = mysql_connect($hname, $uname, $upass);
if( !$db ) {
    echo 'Ошибка базы данных 1.';
    exit(0);
}
		
$charset = mysql_set_charset("cp1251", $db);

mysql_select_db($dbname);

$rdata = wfrom_excel_import( "white-from-errs.xls", $report );
if( is_bool($rdata) ) {
    echo $report;
    exit(0);
}

// $result = mysql_query("CREATE TEMPORARY TABLE white_from_import_".$uid." LIKE white_from");
$result = mysql_query("CREATE TABLE IF NOT EXISTS white_from_import_".$uid." LIKE white_from");
if( !$result ){
    echo 'Ошибка базы данных 2.';
    exit(0);
}	

$result = mysql_query("DELETE FROM white_from_import_".$uid." WHERE user_id=".$uid);
if( !$result ){
    echo 'Ошибка базы данных 3.';
    exit(0);
}	

$result = mysql_query("DELETE FROM white_from_import_".$uid." WHERE user_id=".$uid);
if( !$result ){
    echo 'Ошибка базы данных 3.';
    exit(0);
}	

foreach ($rdata as $row) {
    $address = mysql_real_escape_string($row[1]);
    $subnet  = mysql_real_escape_string($row[2]);
    $comment = iconv("UTF-8","CP1251",mysql_real_escape_string($row[3]));

    $sqlreq = "INSERT white_from_import_".$uid." SET ".
                "user_id='".$uid."', ".
                "address='".$address."', ".
                "subnet='".$subnet."', ".
                "comment='".$comment."'";
                
    if( !mysql_query($sqlreq) ) {
        echo 'Ошибка базы данных. '.mysql_error();
        exit(0);
    }	
}

    echo "Ok. Экспортировано ".count($rdata)." записей";
    exit(0);

/*
$result = mysql_query("SELECT rec_id, address, subnet, comment FROM white_from_import WHERE user_id=".$uid);                  
if( !$result ) {
    echo 'Ошибка базы данных 3.';
    exit(0);
}	


    echo '<table style="border:1px; padding:1em">' . "\n";
    $m = 1;
    foreach ($rdata as $row) {
        echo '<tr>' . "\n";
        echo '<td>' . $row[0] . '</td>' . "\n";
        echo '<td>' . $row[1] . '</td>' . "\n";
        echo '<td>' . $row[2] . '</td>' . "\n";
        echo '<td>' . $row[3] . '</td>' . "\n";
        echo '</tr>' . "\n";
        $m++;
    }

    echo '</table>' . "\n";
    exit(0);
*/

//
// Читает из указаного Excell файла данные
// и записывает их в массив.
//
function wfrom_excel_read( $fname, $maxrow ) {

    require_once '../../lib/PHPExcel.php';

//    $objReader = PHPExcel_IOFactory::createReader('Excel5');
//    $objReader->setReadDataOnly(true);
//    $objPHPExcel = $objReader->load($fname);

    $objPHPExcel = PHPExcel_IOFactory::load($fname);
    if( !is_object( $objPHPExcel ) )
        return false;
        
    $objWorksheet = $objPHPExcel->getActiveSheet();

    $found = false;
    $rows = array();
    $currow = 0;

    $rowIterator = $objWorksheet->getRowIterator();

    foreach ($rowIterator as $row) {

        $currow++;
        if( $maxrow && $currow > $maxrow )
            break;
                
        $cellIterator = $row->getCellIterator();
        $cellIterator->setIterateOnlyExistingCells(false);

        unset( $cells );
        $cells = array();
        foreach ($cellIterator as $cell) {
            $cells[] = $cell->getValue();
        }

// Searchin row that contain the table caption
// or collect data
        if( $found ) {
            if( $scol+2 >= count($cells) )
                continue;

            $address = $cells[$scol];
            if( is_null( $address ) || $address == '' )
                continue;

            $subnet  = $cells[$scol+1];
            $subnet = is_null( $subnet ) ? '' : $subnet;

            $comment = $cells[$scol+2];
            $comment = is_null( $comment ) ? '' : $comment;

            $rows[] = array( $currow, $address, $subnet, $comment );
        }
        else {
            $scol = array_search( "Address", $cells );
            if( $scol !== FALSE &&
                $scol+2 < count($cells) &&
                $cells[$scol+1]=="Subnet" &&
                $cells[$scol+2]=="Comment" )
            {
                $found = true;
            }
        }    
    }
    
    if( !$found )
        return false;
    
    return $rows;
}

//
// Проверяет полученный от wfrom_excel_read массив 
// на ошибки и избыточность.
//

function wfrom_excel_import( $fname, &$report ) {

    $report = "";
    $mxl = new IPDepo();

    $rdata = wfrom_excel_read( $fname, 10000);
    if( $rdata === false ) {
        $report = "Ошибка чтения Excel файла.";
        return false;
    }

// Проверяем импортируемые данные на ошибки и избыточность.
    if( !$mxl->check_white_from_import( $rdata, $report ))
        return false;

    return $rdata;
}

/*
function wfrom_excel_import( $fname, &$report ) {

    $mxl = new IPDepo();

    $rdata = wfrom_excel_read( $fname, 10000);
    if( $rdata === false ) {
        $report = "Ошибка чтения Excel файла.";
        return false;
    }

    $errmess = "";
// Проверяем импортируемые данные на ошибки.
    $errs = array();
    for( $i=0; $i<count($rdata); $i++ ) {
        $row = $rdata[$i];
        $errflags = 0;
        if( !$mxl->is_mail_pattern($row[1]) ) 
            $errflags = $errflags | 0x1;
        if( $row[2] && !$mxl->is_subnet($row[2]) )
            $errflags = $errflags | 0x2;
        if( $errflags ) 
            $errs[] = array( $row[0], $errflags );
    }

    if( count( $errs ) ) {
        $errmess = "<b>Обнаружены ошибки в файле импорта.</b>\n";
        for( $i=0; $i<count($errs); $i++ ) {
            $errmess = $errmess.sprintf("Строка: %d %s %s\n", $errs[$i][0], 
                       ($errs[$i][1] & 0x1) ? "Адрес" : '', ($errs[$i][1] & 0x2) ? "Подсеть" : '' );
        }
        $report = nl2br($errmess)."<b>Импорт отменен.</b>";
        return false;
    }

// Проверяем импортируемые данные на избыточность
    $errcount = 0;
    for( $i=0; $i < count( $rdata )-1; $i++ ) {
        $row = $rdata[$i];
        unset( $nerrs );
        $nerrs = array(array(),array(), array(), array());
        for( $n=$i+1; $n < count( $rdata ); $n++ ) {
            $nrow = $rdata[$n];
            $comp = $mxl->white_from_redundancy( $row[1], $row[2], $nrow[1], $nrow[2] );
            if( $comp === false )
                $nerrs[0][] = $nrow[0];
            else if( $comp > 0 && $comp <= 3 )
                $nerrs[$comp][] = $nrow[0];
        
        }

        if( count($nerrs[0]) || count($nerrs[1]) || count($nerrs[2]) || count($nerrs[3]) ) {
            $errs[] = array( $row[0], $nerrs);
            $errcount++;
        }
        if( count($nerrs[0]) )
            break;
    }

    if( $errcount ) {
        unset( $nerrs );
        $report = "<b>Обнаружены ошибки в файле импорта.</b><br>";
        for( $n=0; $n<$errcount; $n++ ) {
            $nerrs = $errs[$n][1];
            $errmess = sprintf("%d. Строка <b>%d</b>:", $n+1, $errs[$n][0] );
            if( count( $nerrs[0] ) ) {
                $errmess = $errmess."<br>обнаружены неправильные данные в строках: ";
                $errmess = $errmess."<b>".implode(" ", $nerrs[0])."</b>";
            }
            if( count( $nerrs[1] ) ) {
                $errmess = $errmess."<br>является избыточной относительно строк: ";
                $errmess = $errmess."<b>".implode(" ", $nerrs[1])."</b>";
            }

            if( count( $nerrs[2] ) ) {
                $errmess = $errmess."<br>создает избыточность для строк: ";
                $errmess = $errmess."<b>".implode(" ", $nerrs[2])."</b>";
            }

            if( count( $nerrs[3] ) ) {
                $errmess = $errmess."<br>является тождественной строкам: ";
                $errmess = $errmess."<b>".implode(" ",$nerrs[3])."</b>";
            }
            $errmess = $errmess."<br>";
            $report = $report.$errmess;
        }
        $report = $report."<b>Импорт отменен.</b>";
        return false;
    }

    return $rdata;
}
*/
?>
